/***************************************************************************
                                                                             
RRRRRRRRRRRRRRRRR                                              999999999     
R::::::::::::::::R                                           99:::::::::99   
R::::::RRRRRR:::::R                                        99:::::::::::::99 
RR:::::R     R:::::R                                      9::::::99999::::::9
  R::::R     R:::::R    eeeeeeeeeeee  xxxxxxx      xxxxxxx9:::::9     9:::::9
  R::::R     R:::::R  ee::::::::::::ee x:::::x    x:::::x 9:::::9     9:::::9
  R::::RRRRRR:::::R  e::::::eeeee:::::eex:::::x  x:::::x   9:::::99999::::::9
  R:::::::::::::RR  e::::::e     e:::::e x:::::xx:::::x     99::::::::::::::9
  R::::RRRRRR:::::R e:::::::eeeee::::::e  x::::::::::x        99999::::::::9 
  R::::R     R:::::Re:::::::::::::::::e    x::::::::x              9::::::9  
  R::::R     R:::::Re::::::eeeeeeeeeee     x::::::::x             9::::::9   
  R::::R     R:::::Re:::::::e             x::::::::::x           9::::::9    
RR:::::R     R:::::Re::::::::e           x:::::xx:::::x         9::::::9     
R::::::R     R:::::R e::::::::eeeeeeee  x:::::x  x:::::x       9::::::9      
R::::::R     R:::::R  ee:::::::::::::e x:::::x    x:::::x     9::::::9       
RRRRRRRR     RRRRRRR    eeeeeeeeeeeeeexxxxxxx      xxxxxxx   99999999        

 * 文件名：uart_wave.c
 * 版本号：V1.0
 * 作者: rex9
 * 生成日期：2021年1月7日
 * 最近修改：
 * 功能描诉：UART DMA的应用
 * 说明：
 * STM32CubeMX配置USART1
 * USART1_RX DMA1 Channel 5
 * 使能所有中断
 *
 * 模块引脚：
 * RX：PB7，接外部TX
 * TX：PB6，接外部RX
 *
 ***************************************************************************
 */

#include "uart_wave.h"
#include "main.h"
#include "led.h"

//串口句柄
extern DMA_HandleTypeDef hdma_usart1_rx;
extern UART_HandleTypeDef huart1;
//外部函数
extern void Show_WAVE(uint8_t* p,uint16_t num);
//I2C使能
extern uint8_t g_en_i2c;
//接受标志
volatile uint8_t g_uart_rx_flag=0;
//接受缓冲
extern uint8_t g_wave_buffer[BUF_LEN_MAX];
//发送的数据数量
extern uint16_t g_len;

/**
 * @brief  ：串口DMA接收
 * @param  ：无
 * @return：无
 */
void Uart_Rx_DMA_Init(void)
{
	  __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);	//使能空闲中断
	  if(HAL_UART_Receive_DMA(&huart1,g_wave_buffer,BUF_LEN_MAX)!=HAL_OK)	//第一轮串口接受
	  {
	  		Error_Handler();
	  }
}

/**
 * @brief  ：串口后台处理函数
 * @param  ：无
 * @return：无
 */
void Start_Uart_Rx_DMA(void)
{
	  //接收到一帧数据，进行串口处理
	  if(g_uart_rx_flag)
	  {
		  LED_Control(LED_OFF);
		  g_uart_rx_flag=0;	//清标志
		  Show_WAVE(g_wave_buffer,g_len);
		  if(HAL_UART_Receive_DMA(&huart1,g_wave_buffer,BUF_LEN_MAX)!=HAL_OK)	//再次开启串口接收
		  {
			  Error_Handler();
		  }
		  g_en_i2c=1;	//I2C DMA开启
		  LED_Control(LED_ON);
	  }
}

/**
 * @brief  ：空闲中断回调函数
 * @param  ：无
 * @return：无
 */
void Idle_Handler(void)
{
	  //接收好一帧数据发生空闲中断
	  if(__HAL_UART_GET_IT_SOURCE(&huart1,UART_IT_IDLE))
	  {
		  __HAL_UART_CLEAR_IDLEFLAG(&huart1);	//清标志
		  HAL_UART_DMAStop(&huart1);	//停止DMA接收
		  g_len=BUF_LEN_MAX-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);	//计算接收到的字节数
		  g_uart_rx_flag=1;	//打标志位
	  }
}

/**
 * @brief  ：侦测串口接受非空函数
 * @param  ：无
 * @return：无
 */
void Rxne_Handler(void)
{
	  //一旦串口有接受到数据，表示开始传送新的波形数据，失能I2C DMA传送
	  if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET)
	  {
		  g_en_i2c=0;	//停止I2C DMA传送
	  }
}
